package review

import "fmt"

//1.定义一个接口有两个方法 1.1一个方法规定下一个处理流程 1.2传入请求结构体处理逻辑
//2.三个结构体去实现接口
//模拟流水线：一个汽车 1.设置A 2.设置B 3.设置C

type Car struct {
	AA bool
	BB bool
	CC bool
}

func NewCar(a bool, b bool, c bool) *Car {
	return &Car{AA: a, BB: b, CC: c}
}

type Handler interface {
	SetNextHandler(h Handler)
	DoWork(c *Car)
}

type SetA struct {
	Handler Handler
}

func NewSetA() *SetA {
	return &SetA{}
}

func (s *SetA) SetNextHandler(h Handler) {
	s.Handler = h
}

func (s *SetA) DoWork(c *Car) {
	if !c.AA {
		fmt.Println("设置A成功...")
		//设置下一个处理流程
		s.Handler.DoWork(c)
	}
}

type SetB struct {
	Handler Handler
}

func NewSetB() *SetB {
	return &SetB{}
}

func (s *SetB) SetNextHandler(h Handler) {
	s.Handler = h
}

func (s *SetB) DoWork(c *Car) {
	if !c.BB {
		fmt.Println("设置B成功...")
		//设置下一个处理流程
		s.Handler.DoWork(c)
	}
}

type SetC struct {
	Handler Handler
}

func NewSetC() *SetC {
	return &SetC{}
}

func (s *SetC) SetNextHandler(h Handler) {
	s.Handler = h
}

func (s *SetC) DoWork(c *Car) {
	if !c.CC {
		fmt.Println("设置C成功...")
	}
}
